from django.shortcuts import render

from rest_framework import viewsets
from rest_framework.response import Response  # 返回

from apps.lian.models import Student  # 导入学生模型

from rest_framework.status import HTTP_201_CREATED, HTTP_404_NOT_FOUND, HTTP_204_NO_CONTENT  # 状态码

from apps.lian.serializer import StudentSerializer  # 导入学生序列化的类
from apps.lian.models import Classes  # 导入班级模型
from apps.lian.serializer import ClassesSerializer  # 导入班级序列化器

# Create your views here.

# 第一种
"""
class StudentViewSet(viewsets.ViewSet):  # 继承与：viewsets.ViewSet
    # 方法名是固定的
    # 查一组数据
    def list(self,request):
        # 获取查询所有的数据集合
        queryset = Student.objects.all()
        # 序列化   如果查询拿到的是查询集就用这个 many = True 不是则不需要使用这一个
        serialize = StudentSerializer(queryset,many=True)  # 实例化一个序列化器 把从数据库获取的数据换成一个：(json格式的数据)

        return Response(serialize.data)  # 返回响应的数据 序列化器的对象.data 属性 就json格式的数据

    # 增加数据
    def create(self,request):
        '''
        1.从前端获取数据进行添加到数据库当中
        2.检验
        3.保存数据
        4.响应 提示用户添加成功
        :param request:
        :return:
        '''
        # 前端传入过来的在请求(request)的data属性里面
        quan = request.data  # 获取前端数据
        # 反序列化
        res = StudentSerializer(data=quan)  # data= 前端的数据
        # 检验
        res.is_valid(raise_exception=True)  # 如果有异常则抛出异常：raise_exception=True
        # 保存数据
        res.save()
        # 响应
        return Response(res.data,status=HTTP_201_CREATED)   # status= 状态码


    # 查单一的
    def retrieve(self,request,pk):
        '''
        1.依据pk值查询指定对象
        2.查询的对象会出现俩种情况:
            1.有，就要序列化
            2.没有,返回一个状态码
        3.返回响应
        :param request:
        :param pk:
        :return:
        '''
        try:
            single = Student.objects.get(pk=pk)
        except Student.DoesNotExist:
            return Response(status=HTTP_404_NOT_FOUND)
        # 序列化  不是一个查询讯集则使用：instance =
        serialization = StudentSerializer(instance=single)

        return Response(serialization.data)


    # 修改
    def update(self,request,pk):
        '''
        1.依据pk值查询指定对象
            2.查询的对象会出现俩种情况:
                1.有，就要序列化
                2.没有,返回一个状态码
        2.从前端获取数据进行添加到数据库当中
        3.检验
        4.保存数据
        5.响应 提示用户修改成功
        :param request:
        :param pk:
        :return:
        '''
        try:
            single = Student.objects.get(pk=pk)
        except Student.DoesNotExist: # 没有：异常处理
            return Response(status=HTTP_404_NOT_FOUND)


        # 序列化
        serialization = StudentSerializer(instance=single,data=request.data)  # data=request.data 前端传入过来的数据

        # 检验
        serialization.is_valid(raise_exception=True) # raise_exception=True 有异常则抛出异常

        # 保存数据
        serialization.save()

        return Response(serialization.data)

    # 删除
    def destroy(self,request,pk):
        '''
        获取对象
        可能:有
        可能:没有
        :param request:
        :param pk:
        :return:
        '''
        try:
            # 获取对象
            huo = Student.objects.get(pk=pk)
        except Student.DoesNotExist:  # 没有则异常处理  Student 是模型
            return Response(status=HTTP_404_NOT_FOUND)

        # 删除
        huo.delete()  # 这种是直接删除数据库里面的数据

        return Response(status=HTTP_204_NO_CONTENT)  # 返回一个状态码

"""


# 第二种
class StudentViewSet(viewsets.ModelViewSet):  # 继承：viewsets.ModelViewSet 已经写好了增删改查
    # 属性是固定的
    queryset = Student.objects.filter(is_delete=False)  # 查询  符合False的
    serializer_class = StudentSerializer  # 指定序列化的类


from rest_framework.decorators import action  # 装饰器把自定义的接口添加到urls路径里面去

# 班级视图
class ClassesViewSet(viewsets.ModelViewSet):  # 继承：viewsets.ModelViewSet 已经写好了增删改查
    # 对接口方法的文档描述文字
    '''
    list:
    查看全部班级信息
    create:
    新增班级信息
    retrieve:
    查看某个班级信息
    update:
    修改某个班级信息
    destroy:
    删除某个班级信息
    last:
    查看最新班级信息
    '''
    # 属性是固定的
    queryset = Classes.objects.filter(is_delete=False)  # 查询符合False的
    serializer_class = ClassesSerializer  # 指定序列化器

    # 新增接口
    # 查看最新的班级   detail= False 表示不需要带参数 True则要带pk参数
    @action(methods=['get'],detail=False)  # 把接口添加到路径里面去 methods= 表示通过那种请求方式请求该方法
    def last(self,request):
        list_set = Classes.objects.filter(is_delete=False).last()
        serializer = self.get_serializer(list_set)  # 序列化


        # 返回
        return Response(serializer.data)
